#!/usr/bin/env sh
# SPDX-License-Identifier: GPL-3.0-or-later
# Copyright (c) 2014-2016,2020-2021,2023-2024 Leah Rowe <leah@libreboot.org>
# Copyright (c) 2021-2022 Ferass El Hafidi <vitali64pmemail@protonmail.com>
# Copyright (c) 2022 Caleb La Grange <thonkpeasant@protonmail.com>
# Copyright (c) 2022-2023 Alper Nebi Yasak <alpernebiyasak@gmail.com>
# Copyright (c) 2023 Riku Viitanen <riku.viitanen@protonmail.com>

mkpayload_grub()
{
	eval `setvars "" grub_modules grub_install_modules`
	$dry eval `setcfg "$grubdata/module/$tree"`
	$dry x_ rm -f "$srcdir/grub.elf"; $dry \
	"$srcdir/grub-mkstandalone" --grub-mkimage="$srcdir/grub-mkimage" \
	    -O i386-coreboot -o "$srcdir/grub.elf" -d "${srcdir}/grub-core/" \
	    --fonts= --themes= --locales=  --modules="$grub_modules" \
	    --install-modules="$grub_install_modules" \
	    "/boot/grub/grub_default.cfg=${srcdir}/.config" \
	    "/boot/grub/grub.cfg=$grubdata/memdisk.cfg" \
	    "/background.png=$grubdata/background/background1280x800.png" || \
	    $err "$tree: cannot build grub.elf"; return 0
}

mkvendorfiles()
{
	[ -z "$mode" ] && $dry cook_coreboot_config
	check_cbfstool "$tree"; printf "69\n" > "$srcdir/.coreboot-version" \
	    || $err "!cbver $srcdir"; [ -z "$mode" ] && \
	    [ "$target" != "$tree" ] && x_ ./vendor download $target; return 0
}

cook_coreboot_config()
{
	[ -f "$srcdir/.config" ] || return 0
	printf "CONFIG_CCACHE=y\n" >> "$srcdir/.config" || \
	    $err "$srcdir/.config: Could not enable ccache"
	make -C "$srcdir" oldconfig || $err "Could not cook $srcdir/.config"; :
}

check_cbfstool()
{
	[ "$badhash" = "n" ] || rm -f "elf/cbfstool/$1/cbfstool" || \
	    $err "!rm badelf elf/cbfstool/$1/cbfstool"
	e "elf/cbfstool/$1/cbfstool" f && return 0

	utilelfdir="elf/cbfstool/$1"
	utilsrcdir="src/coreboot/$1/util/cbfstool"

	utilmode="" && [ -n "$mode" ] && utilmode="clean"
	x_ make -C "$utilsrcdir" $utilmode -j$XBMK_THREADS $makeargs
	[ -z "$mode" ] && [ ! -f "$utilelfdir/cbfstool" ] && \
		x_ mkdir -p "$utilelfdir" && \
		x_ cp "$utilsrcdir/cbfstool" "elf/cbfstool/$1"
	[ -z "$mode" ] || x_ rm -Rf "$utilelfdir"; :
}

mkcorebootbin()
{
	[ "$target" = "$tree" ] && return 0

	tmprom="$srcdir/build/coreboot.rom"; initmode="${defconfig##*/}";
	displaymode="${initmode##*_}"; initmode="${initmode%%_*}"
	[ -n "$displaymode" ] && displaymode="_$displaymode"
	cbfstool="elf/cbfstool/$tree/cbfstool"

	[ -z "$grub_scan_disk" ] && grub_scan_disk="nvme ahci ata"
	[ -n "$grubtree" ] || grubtree="default"
	grubelf="elf/grub/$grubtree/payload/grub.elf"

	[ "$payload_memtest" = "y" ] || payload_memtest="n"
	[ "$(uname -m)" = "x86_64" ] || payload_memtest="n"

	pname="custom" && grep "CONFIG_PAYLOAD_NONE=y" "$defconfig" && \
	    pname="seabios"; $dry add_seabios

	newrom="bin/$target/${pname}_${target}_$initmode$displaymode.rom"
	$dry x_ mkdir -p "${newrom%/*}"; $dry x_ mv "$tmprom" "$newrom"
}

add_seabios()
{
	_seabioself="elf/seabios/default/$initmode/bios.bin.elf"

	cbfs "$tmprom" "$_seabioself" "fallback/payload"
	x_ "$cbfstool" "$tmprom" add-int -i 3000 -n etc/ps2-keyboard-spinup

	_z="2"; [ "$initmode" = "vgarom" ] && _z="0"
	x_ "$cbfstool" "$tmprom" add-int -i $_z -n etc/pci-optionrom-exec
	x_ "$cbfstool" "$tmprom" add-int -i 0 -n etc/optionroms-checksum
	[ "$initmode" = "libgfxinit" ] && \
	    cbfs "$tmprom" "$seavgabiosrom" vgaroms/seavgabios.bin raw

	[ "$payload_memtest" = "y" ] && cbfs "$tmprom" \
	    "elf/memtest86plus/memtest.bin" img/memtest

	[ "$payload_grub" = "y" ] && pname="seagrub" && add_grub; return 0
}

add_grub()
{
	cbfs "$tmprom" "$grubelf" "img/grub2"
	printf "set grub_scan_disk=\"%s\"\n" "$grub_scan_disk" \
	    > "$TMPDIR/tmpcfg" || $err "$target: !insert scandisk"
	cbfs "$tmprom" "$TMPDIR/tmpcfg" scan.cfg raw
	cbfs "$tmprom" "$grubdata/bootorder" bootorder raw
}
